home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 26 / AMIGAplus Sonderheft 26 (2000)(Falke)(DE)(Track 1 of 2)[!].iso / Tools / Packer / xfd / Developer / include / AmigaE / EPrograms / xfdtextview.e
Text File  |  1999-03-29  |  5KB  |  210 lines

  1. /*
  2.  
  3.     Note: It seems that the scrollwin-module (class/sctext.m) is broken
  4.           since E v3.3. All programs that use this module crash at the
  5.           scrolltext.open()-call. I don't know why and there is nothing
  6.           I can do to avoid this.
  7.           I have included the old modules in EModules/class. So just
  8.           copy sc.m and sctext.m to your module directory.
  9.  
  10. */
  11.  
  12. /* show a textfile in a nice juicy scrolling window
  13. ** NEW from DII: XFD support added 12/4/96
  14. **
  15. ** Modified to work with v38 xfdmaster-includes and added asl-support
  16. ** on 05.11.98 by Sven Steiniger.
  17. */
  18.  
  19. OPT PREPROCESS
  20. OPT REG=5
  21. OPT OSVERSION=36  -> For Asl.library, OpenLibrary, etc.
  22.  
  23. MODULE 'exec/memory',
  24.        'asl','libraries/asl',
  25.        'xfdmaster','libraries/xfdmaster',
  26.        'utility/tagitem'
  27. MODULE 'tools/file',
  28.        'class/sctext'
  29.  
  30. RAISE "ASL"  IF AllocAslRequest()=NIL,
  31.       "MEM"  IF XfdAllocObject()=NIL,
  32.       "xfd"  IF XfdDecrunchBuffer()=FALSE
  33.  
  34.  
  35. DEF bufferinfo=NIL:PTR TO xfdBufferInfo
  36.  
  37.  
  38. PROC main() HANDLE
  39. DEF aslreq=NIL:PTR TO filerequester,
  40.     filename[256]:STRING,
  41.     error[5]:ARRAY OF CHAR
  42.  
  43.   /* Open libraries.
  44.   */
  45.   IF (aslbase:=OpenLibrary(ASLNAME,36))=NIL THEN
  46.     Throw("LIB",ASLNAME)
  47.   IF (xfdmasterbase:=OpenLibrary(XFDM_NAME,XFDM_VERSION))=NIL THEN
  48.     Throw("LIB",XFDM_NAME)
  49.  
  50.   /* Allocate resources.
  51.   */
  52.   StrCopy(filename, arg)
  53.   bufferinfo:=XfdAllocObject(XFDOBJ_BUFFERINFO)
  54.   aslreq:=AllocAslRequest(ASL_FILEREQUEST,
  55.                           [ASLFR_INITIALFILE, filename,
  56.                            TAG_DONE,0])
  57.  
  58.   IF FileLength(filename)<=0
  59.     /* File doesn't exists, so open an asl-requester
  60.     */
  61.     IF AslRequest(aslreq,NIL)
  62.       StrCopy(filename,aslreq.drawer)
  63.       AddPart(filename,aslreq.file,StrMax(filename))
  64.       SetStr(filename,StrLen(filename))
  65.     ENDIF
  66.   ENDIF
  67.  
  68.   /* now display the file contents
  69.   */
  70.   displayFile(filename)
  71.  
  72.  
  73. EXCEPT DO
  74.  
  75.   /* Free resources
  76.   */
  77.   IF aslreq THEN FreeAslRequest(aslreq)
  78.   IF bufferinfo THEN XfdFreeObject(bufferinfo)
  79.  
  80.   /* Close libraries
  81.   */
  82.   CloseLibrary(xfdmasterbase)
  83.   CloseLibrary(aslbase)
  84.  
  85.   /* Print an error-description (if necessary)
  86.   */
  87.   IF exception
  88.  
  89.     error[4]:=0
  90.     ^error:=exception
  91.     WHILE error[]=0 DO error++
  92.  
  93.     WriteF('Error: ')
  94.     SELECT exception
  95.       CASE "MEM"  ; WriteF('Not enough memeory\n')
  96.       CASE "OPEN" ; WriteF('Could not open file \s\n',exceptioninfo)
  97.       CASE "LIB"  ; WriteF('Could not open \s\n',exceptioninfo)
  98.       DEFAULT     ; WriteF('"\s": \s\n',error, IF exceptioninfo>1000 THEN exceptioninfo ELSE '??')
  99.     ENDSELECT
  100.   ENDIF
  101.  
  102. ENDPROC
  103.  
  104.  
  105. /* Loads an displays an file
  106. */
  107. PROC displayFile(name) HANDLE
  108. DEF mem=NIL:PTR TO CHAR,
  109.     length,
  110.     listi=NIL:PTR TO LONG,
  111.     cruncher:PTR TO CHAR
  112. DEF title[60]:STRING,
  113.     max_linelen=0,
  114.     text,
  115.     sc=NIL:PTR TO scrolltext
  116.  
  117.  
  118.   /* Load file and make the contents an linked list of strings.
  119.   */
  120.   mem,length,cruncher:=readXFDTextFile(name)
  121.   listi:=stringsinfile(mem,length,countstrings(mem,length))
  122.  
  123.   /* Find the maximum line length.
  124.   */
  125.   ForAll({text},listi,`(max_linelen:=Max(StrLen(text),max_linelen)))
  126.  
  127.   /* Now display the text.
  128.   */
  129.   StringF(title,'TextView 2.0 (\s)',cruncher)
  130.   NEW sc.settext(listi,max_linelen)
  131.   sc.open(title,20,20,300,150)
  132.  
  133.   /* Wait until window quits.
  134.   */
  135.   WHILE sc.handle()=FALSE DO Wait(-1)
  136.  
  137. EXCEPT DO
  138.  
  139.   END sc
  140.  
  141.   IF listi THEN DisposeLink(listi)
  142.   freeXFDTextFile(mem)
  143.  
  144.   ReThrow()
  145.  
  146. ENDPROC
  147.  
  148.  
  149. /* Reads an file and decrunchs it if necessary.
  150. */
  151. PROC readXFDTextFile(name:PTR TO CHAR) HANDLE
  152. DEF mem=NIL:PTR TO CHAR,
  153.     length,
  154.     cruncher
  155.  
  156.   mem,length:=readfile(name)
  157.   cruncher:='ASCII'
  158.  
  159.   bufferinfo.xfdbi_SourceBuffer:=mem
  160.   bufferinfo.xfdbi_SourceBufLen:=length
  161.   bufferinfo.xfdbi_Flags       :=0
  162.  
  163.   IF XfdRecogBuffer(bufferinfo)
  164.  
  165.     IF bufferinfo.xfdbi_PackerFlags AND (XFDPFF_PASSWORD OR XFDPFF_KEY16 OR XFDPFF_KEY32)
  166.       Throw("p/k", 'Password required.')
  167.     ENDIF
  168.  
  169.     bufferinfo.xfdbi_TargetBufMemType:=MEMF_PUBLIC
  170.     XfdDecrunchBuffer(bufferinfo)
  171.  
  172.     freefile(mem)
  173.  
  174.     mem      := bufferinfo.xfdbi_TargetBuffer
  175.     cruncher := bufferinfo.xfdbi_PackerName
  176.  
  177.     /* Last element must be an '\n'. readfile() does this automatical
  178.     ** but with xfd we must do it here. Problem: if decrunchbuffer is
  179.     ** too small then the last character is lost.
  180.     */
  181.     length   := Min(bufferinfo.xfdbi_TargetBufSaveLen+1, bufferinfo.xfdbi_TargetBufLen)
  182.     mem[length-1]:="\n"
  183.  
  184.   ENDIF
  185.  
  186. EXCEPT
  187.  
  188.   IF mem THEN freefile(mem)
  189.   ReThrow()
  190.  
  191. ENDPROC mem,length,cruncher
  192.  
  193.  
  194. /* Frees resources which are allocated by readXFDFile().
  195. */
  196. PROC freeXFDTextFile(mem)
  197.  
  198.   IF mem
  199.     IF mem=bufferinfo.xfdbi_TargetBuffer
  200.       FreeMem(mem,bufferinfo.xfdbi_TargetBufLen)
  201.       bufferinfo.xfdbi_TargetBuffer:=NIL
  202.     ELSE
  203.       freefile(mem)
  204.     ENDIF
  205.   ENDIF
  206.  
  207. ENDPROC
  208.  
  209.  
  210.